package mtt.us.client.views.index;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import mtt.us.client.events.SetModelDataEvent;
import mtt.us.client.events.ShowIndexViewEvent;
import mtt.us.client.views.fachbereich.events.ShowStudiengaengeEvent;
import mtt.us.client.views.fachbereich.studiengang.events.ShowMatrikelEvent;
import mtt.us.dto.FachbereichDTO;
import mtt.us.dto.StudiengangDTO;
import mtt.us.hmvcFramework.client.hmvc.events.DisposeEvent;
import mtt.us.hmvcFramework.client.hmvc.events.RemoveViewEvent;
import mtt.us.hmvcFramework.client.hmvc.view.GuiView;

import com.google.gwt.user.client.History;
import com.google.gwt.user.client.HistoryListener;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.VerticalPanel;

import hmvc4gwt.client.event.HmvcEvent;

public class IndexView extends GuiView implements HistoryListener {

	/**
	 * key: targetHistoryToken value: assoziatet Object
	 */
	private HashMap mapEvents = new HashMap();

	public void doInitImpl() {

		getController().register(SetModelDataEvent.class, this);
		History.addHistoryListener(this);
	}

	public void handleEvent(HmvcEvent event) {

		if (event instanceof SetModelDataEvent) {

			refreshView((List) event.getPayload());

		}
	}

	public void onHistoryChanged(String historyToken) {

		if (!mapEvents.containsKey(historyToken)) {
			getController().fireEvent(new DisposeEvent(), false, false, true);
			getController().fireLocalEvent(new ShowIndexViewEvent());
		}

		/*
		 * Object-Typ feststellen
		 */
		Object object = mapEvents.get(historyToken);

		if (object instanceof FachbereichDTO) {

			/*
			 * aktuelle View entfernen
			 */
			getController().fireEvent(new RemoveViewEvent(this), true, false,
					false);

			/*
			 * StudiengangView anzeigen
			 */
			getController().fireLocalEvent(
					new ShowStudiengaengeEvent((FachbereichDTO) object));

		} else if (object instanceof StudiengangDTO) {

			/*
			 * aktuelle View entfernen
			 */

			getController().fireEvent(new RemoveViewEvent(this), true, false,
					false);

			/*
			 * MatrikelView anzeigen
			 */
			getController().fireLocalEvent(
					new ShowMatrikelEvent((StudiengangDTO) object));
		}

	}

	private void refreshView(List listFachbereiche) {

		clear();

		/*
		 * jeden Fachbereich in eine Spalte
		 */
		Iterator iterator = listFachbereiche.iterator();
		while (iterator.hasNext()) {

			FachbereichDTO fachbereich = (FachbereichDTO) iterator.next();

			VerticalPanel verticalPanel = new VerticalPanel();
			verticalPanel.setStylePrimaryName("indexFachbereichPanel");

			/*
			 * Link "Fachbereich X" erstellen
			 */
			Hyperlink linkFachbereichName = new Hyperlink(
					fachbereich.getName(), "Fachbereich="
							+ fachbereich.getFachbereichNummer());
			linkFachbereichName.setStylePrimaryName("indexFachbereichTitle");

			/*
			 * zum Panel hinzufügen
			 */
			verticalPanel.add(linkFachbereichName);

			/*
			 * link zu mapEvents hinzufügen
			 */
			mapEvents.put(linkFachbereichName.getTargetHistoryToken(),
					fachbereich);

			/*
			 * Jeden Studiengang des Fachbereichs in die gleiche Spalte
			 */
			Iterator iteratorStudiengaenge = fachbereich.getListStudiengaenge()
					.iterator();
			while (iteratorStudiengaenge.hasNext()) {

				StudiengangDTO studiengang = (StudiengangDTO) iteratorStudiengaenge
						.next();

				/*
				 * Link "<StudiengangName>" erstellen
				 */
				Hyperlink linkStudiengang = new Hyperlink(
						studiengang.getName(), "Studiengang="
								+ studiengang.getId());
				linkStudiengang.setStylePrimaryName("indexStudiengangList");

				/*
				 * Studiengang zur Event-Map hinzufügen
				 */
				mapEvents.put(linkStudiengang.getTargetHistoryToken(),
						studiengang);

				verticalPanel.add(linkStudiengang);
			}

			/*
			 * FachbereichTabele in der Hauptabellen positionieren
			 */
			add(verticalPanel);
		}

	}

}
